1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.collect.Iterators.advance;
20 import static com.google.common.collect.Iterators.get;
21 import static com.google.common.collect.Iterators.getLast;
22 import static com.google.common.collect.Lists.newArrayList;
23 import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
24 import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
25 import static com.google.common.truth.Truth.assertThat;
26 import static java.util.Arrays.asList;
27 import static java.util.Collections.singleton;
28
29 import com.google.common.annotations.GwtCompatible;
30 import com.google.common.annotations.GwtIncompatible;
31 import com.google.common.base.Function;
32 import com.google.common.base.Predicate;
33 import com.google.common.base.Predicates;
34 import com.google.common.collect.testing.IteratorFeature;
35 import com.google.common.collect.testing.IteratorTester;
36 import com.google.common.collect.testing.ListTestSuiteBuilder;
37 import com.google.common.collect.testing.TestStringListGenerator;
38 import com.google.common.collect.testing.features.CollectionFeature;
39 import com.google.common.collect.testing.features.CollectionSize;
40 import com.google.common.collect.testing.features.ListFeature;
41 import com.google.common.testing.NullPointerTester;
42
43 import junit.framework.AssertionFailedError;
44 import junit.framework.Test;
45 import junit.framework.TestCase;
46 import junit.framework.TestSuite;
47
48 import java.util.Arrays;
49 import java.util.Collection;
50 import java.util.Collections;
51 import java.util.ConcurrentModificationException;
52 import java.util.Enumeration;
53 import java.util.Iterator;
54 import java.util.List;
55 import java.util.ListIterator;
56 import java.util.NoSuchElementException;
57 import java.util.RandomAccess;
58 import java.util.Set;
59 import java.util.Vector;
60
61
62
63
64
65
66 @GwtCompatible(emulated = true)
67 public class IteratorsTest extends TestCase {
68
69 @GwtIncompatible("suite")
70 public static Test suite() {
71 TestSuite suite = new TestSuite(IteratorsTest.class.getSimpleName());
72 suite.addTest(testsForRemoveAllAndRetainAll());
73 suite.addTestSuite(IteratorsTest.class);
74 return suite;
75 }
76
77 public void testEmptyIterator() {
78 Iterator<String> iterator = Iterators.emptyIterator();
79 assertFalse(iterator.hasNext());
80 try {
81 iterator.next();
82 fail("no exception thrown");
83 } catch (NoSuchElementException expected) {
84 }
85 try {
86 iterator.remove();
87 fail("no exception thrown");
88 } catch (UnsupportedOperationException expected) {
89 }
90 }
91
92 public void testEmptyListIterator() {
93 ListIterator<String> iterator = Iterators.emptyListIterator();
94 assertFalse(iterator.hasNext());
95 assertFalse(iterator.hasPrevious());
96 assertEquals(0, iterator.nextIndex());
97 assertEquals(-1, iterator.previousIndex());
98 try {
99 iterator.next();
100 fail("no exception thrown");
101 } catch (NoSuchElementException expected) {
102 }
103 try {
104 iterator.previous();
105 fail("no exception thrown");
106 } catch (NoSuchElementException expected) {
107 }
108 try {
109 iterator.remove();
110 fail("no exception thrown");
111 } catch (UnsupportedOperationException expected) {
112 }
113 try {
114 iterator.set("a");
115 fail("no exception thrown");
116 } catch (UnsupportedOperationException expected) {
117 }
118 try {
119 iterator.add("a");
120 fail("no exception thrown");
121 } catch (UnsupportedOperationException expected) {
122 }
123 }
124
125 public void testEmptyModifiableIterator() {
126 Iterator<String> iterator = Iterators.emptyModifiableIterator();
127 assertFalse(iterator.hasNext());
128 try {
129 iterator.next();
130 fail("Expected NoSuchElementException");
131 } catch (NoSuchElementException expected) {
132 }
133 try {
134 iterator.remove();
135 fail("Expected IllegalStateException");
136 } catch (IllegalStateException expected) {
137 }
138 }
139
140 public void testSize0() {
141 Iterator<String> iterator = Iterators.emptyIterator();
142 assertEquals(0, Iterators.size(iterator));
143 }
144
145 public void testSize1() {
146 Iterator<Integer> iterator = Collections.singleton(0).iterator();
147 assertEquals(1, Iterators.size(iterator));
148 }
149
150 public void testSize_partiallyConsumed() {
151 Iterator<Integer> iterator = asList(1, 2, 3, 4, 5).iterator();
152 iterator.next();
153 iterator.next();
154 assertEquals(3, Iterators.size(iterator));
155 }
156
157 public void test_contains_nonnull_yes() {
158 Iterator<String> set = asList("a", null, "b").iterator();
159 assertTrue(Iterators.contains(set, "b"));
160 }
161
162 public void test_contains_nonnull_no() {
163 Iterator<String> set = asList("a", "b").iterator();
164 assertFalse(Iterators.contains(set, "c"));
165 }
166
167 public void test_contains_null_yes() {
168 Iterator<String> set = asList("a", null, "b").iterator();
169 assertTrue(Iterators.contains(set, null));
170 }
171
172 public void test_contains_null_no() {
173 Iterator<String> set = asList("a", "b").iterator();
174 assertFalse(Iterators.contains(set, null));
175 }
176
177 public void testGetOnlyElement_noDefault_valid() {
178 Iterator<String> iterator = Collections.singletonList("foo").iterator();
179 assertEquals("foo", Iterators.getOnlyElement(iterator));
180 }
181
182 public void testGetOnlyElement_noDefault_empty() {
183 Iterator<String> iterator = Iterators.emptyIterator();
184 try {
185 Iterators.getOnlyElement(iterator);
186 fail();
187 } catch (NoSuchElementException expected) {
188 }
189 }
190
191 public void testGetOnlyElement_noDefault_moreThanOneLessThanFiveElements() {
192 Iterator<String> iterator = asList("one", "two").iterator();
193 try {
194 Iterators.getOnlyElement(iterator);
195 fail();
196 } catch (IllegalArgumentException expected) {
197 assertEquals("expected one element but was: <one, two>",
198 expected.getMessage());
199 }
200 }
201
202 public void testGetOnlyElement_noDefault_fiveElements() {
203 Iterator<String> iterator =
204 asList("one", "two", "three", "four", "five").iterator();
205 try {
206 Iterators.getOnlyElement(iterator);
207 fail();
208 } catch (IllegalArgumentException expected) {
209 assertEquals("expected one element but was: "
210 + "<one, two, three, four, five>",
211 expected.getMessage());
212 }
213 }
214
215 public void testGetOnlyElement_noDefault_moreThanFiveElements() {
216 Iterator<String> iterator =
217 asList("one", "two", "three", "four", "five", "six").iterator();
218 try {
219 Iterators.getOnlyElement(iterator);
220 fail();
221 } catch (IllegalArgumentException expected) {
222 assertEquals("expected one element but was: "
223 + "<one, two, three, four, five, ...>",
224 expected.getMessage());
225 }
226 }
227
228 public void testGetOnlyElement_withDefault_singleton() {
229 Iterator<String> iterator = Collections.singletonList("foo").iterator();
230 assertEquals("foo", Iterators.getOnlyElement(iterator, "bar"));
231 }
232
233 public void testGetOnlyElement_withDefault_empty() {
234 Iterator<String> iterator = Iterators.emptyIterator();
235 assertEquals("bar", Iterators.getOnlyElement(iterator, "bar"));
236 }
237
238 public void testGetOnlyElement_withDefault_empty_null() {
239 Iterator<String> iterator = Iterators.emptyIterator();
240 assertNull(Iterators.getOnlyElement(iterator, null));
241 }
242
243 public void testGetOnlyElement_withDefault_two() {
244 Iterator<String> iterator = asList("foo", "bar").iterator();
245 try {
246 Iterators.getOnlyElement(iterator, "x");
247 fail();
248 } catch (IllegalArgumentException expected) {
249 assertEquals("expected one element but was: <foo, bar>",
250 expected.getMessage());
251 }
252 }
253
254 @GwtIncompatible("Iterators.toArray(Iterator, Class)")
255 public void testToArrayEmpty() {
256 Iterator<String> iterator = Collections.<String>emptyList().iterator();
257 String[] array = Iterators.toArray(iterator, String.class);
258 assertTrue(Arrays.equals(new String[0], array));
259 }
260
261 @GwtIncompatible("Iterators.toArray(Iterator, Class)")
262 public void testToArraySingleton() {
263 Iterator<String> iterator = Collections.singletonList("a").iterator();
264 String[] array = Iterators.toArray(iterator, String.class);
265 assertTrue(Arrays.equals(new String[] { "a" }, array));
266 }
267
268 @GwtIncompatible("Iterators.toArray(Iterator, Class)")
269 public void testToArray() {
270 String[] sourceArray = new String[] {"a", "b", "c"};
271 Iterator<String> iterator = asList(sourceArray).iterator();
272 String[] newArray = Iterators.toArray(iterator, String.class);
273 assertTrue(Arrays.equals(sourceArray, newArray));
274 }
275
276 public void testFilterSimple() {
277 Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
278 Iterator<String> filtered = Iterators.filter(unfiltered,
279 Predicates.equalTo("foo"));
280 List<String> expected = Collections.singletonList("foo");
281 List<String> actual = Lists.newArrayList(filtered);
282 assertEquals(expected, actual);
283 }
284
285 public void testFilterNoMatch() {
286 Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
287 Iterator<String> filtered = Iterators.filter(unfiltered,
288 Predicates.alwaysFalse());
289 List<String> expected = Collections.emptyList();
290 List<String> actual = Lists.newArrayList(filtered);
291 assertEquals(expected, actual);
292 }
293
294 public void testFilterMatchAll() {
295 Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
296 Iterator<String> filtered = Iterators.filter(unfiltered,
297 Predicates.alwaysTrue());
298 List<String> expected = Lists.newArrayList("foo", "bar");
299 List<String> actual = Lists.newArrayList(filtered);
300 assertEquals(expected, actual);
301 }
302
303 public void testFilterNothing() {
304 Iterator<String> unfiltered = Collections.<String>emptyList().iterator();
305 Iterator<String> filtered = Iterators.filter(unfiltered,
306 new Predicate<String>() {
307 @Override
308 public boolean apply(String s) {
309 throw new AssertionFailedError("Should never be evaluated");
310 }
311 });
312
313 List<String> expected = Collections.emptyList();
314 List<String> actual = Lists.newArrayList(filtered);
315 assertEquals(expected, actual);
316 }
317
318 @GwtIncompatible("unreasonably slow")
319 public void testFilterUsingIteratorTester() {
320 final List<Integer> list = asList(1, 2, 3, 4, 5);
321 final Predicate<Integer> isEven = new Predicate<Integer>() {
322 @Override
323 public boolean apply(Integer integer) {
324 return integer % 2 == 0;
325 }
326 };
327 new IteratorTester<Integer>(5, UNMODIFIABLE, asList(2, 4),
328 IteratorTester.KnownOrder.KNOWN_ORDER) {
329 @Override protected Iterator<Integer> newTargetIterator() {
330 return Iterators.filter(list.iterator(), isEven);
331 }
332 }.test();
333 }
334
335 public void testAny() {
336 List<String> list = Lists.newArrayList();
337 Predicate<String> predicate = Predicates.equalTo("pants");
338
339 assertFalse(Iterators.any(list.iterator(), predicate));
340 list.add("cool");
341 assertFalse(Iterators.any(list.iterator(), predicate));
342 list.add("pants");
343 assertTrue(Iterators.any(list.iterator(), predicate));
344 }
345
346 public void testAll() {
347 List<String> list = Lists.newArrayList();
348 Predicate<String> predicate = Predicates.equalTo("cool");
349
350 assertTrue(Iterators.all(list.iterator(), predicate));
351 list.add("cool");
352 assertTrue(Iterators.all(list.iterator(), predicate));
353 list.add("pants");
354 assertFalse(Iterators.all(list.iterator(), predicate));
355 }
356
357 public void testFind_firstElement() {
358 Iterable<String> list = Lists.newArrayList("cool", "pants");
359 Iterator<String> iterator = list.iterator();
360 assertEquals("cool", Iterators.find(iterator, Predicates.equalTo("cool")));
361 assertEquals("pants", iterator.next());
362 }
363
364 public void testFind_lastElement() {
365 Iterable<String> list = Lists.newArrayList("cool", "pants");
366 Iterator<String> iterator = list.iterator();
367 assertEquals("pants", Iterators.find(iterator,
368 Predicates.equalTo("pants")));
369 assertFalse(iterator.hasNext());
370 }
371
372 public void testFind_notPresent() {
373 Iterable<String> list = Lists.newArrayList("cool", "pants");
374 Iterator<String> iterator = list.iterator();
375 try {
376 Iterators.find(iterator, Predicates.alwaysFalse());
377 fail();
378 } catch (NoSuchElementException e) {
379 }
380 assertFalse(iterator.hasNext());
381 }
382
383 public void testFind_matchAlways() {
384 Iterable<String> list = Lists.newArrayList("cool", "pants");
385 Iterator<String> iterator = list.iterator();
386 assertEquals("cool", Iterators.find(iterator, Predicates.alwaysTrue()));
387 }
388
389 public void testFind_withDefault_first() {
390 Iterable<String> list = Lists.newArrayList("cool", "pants");
391 Iterator<String> iterator = list.iterator();
392 assertEquals("cool",
393 Iterators.find(iterator, Predicates.equalTo("cool"), "woot"));
394 assertEquals("pants", iterator.next());
395 }
396
397 public void testFind_withDefault_last() {
398 Iterable<String> list = Lists.newArrayList("cool", "pants");
399 Iterator<String> iterator = list.iterator();
400 assertEquals("pants",
401 Iterators.find(iterator, Predicates.equalTo("pants"), "woot"));
402 assertFalse(iterator.hasNext());
403 }
404
405 public void testFind_withDefault_notPresent() {
406 Iterable<String> list = Lists.newArrayList("cool", "pants");
407 Iterator<String> iterator = list.iterator();
408 assertEquals("woot",
409 Iterators.find(iterator, Predicates.alwaysFalse(), "woot"));
410 assertFalse(iterator.hasNext());
411 }
412
413 public void testFind_withDefault_notPresent_nullReturn() {
414 Iterable<String> list = Lists.newArrayList("cool", "pants");
415 Iterator<String> iterator = list.iterator();
416 assertNull(
417 Iterators.find(iterator, Predicates.alwaysFalse(), null));
418 assertFalse(iterator.hasNext());
419 }
420
421 public void testFind_withDefault_matchAlways() {
422 Iterable<String> list = Lists.newArrayList("cool", "pants");
423 Iterator<String> iterator = list.iterator();
424 assertEquals("cool",
425 Iterators.find(iterator, Predicates.alwaysTrue(), "woot"));
426 assertEquals("pants", iterator.next());
427 }
428
429 public void testTryFind_firstElement() {
430 Iterable<String> list = Lists.newArrayList("cool", "pants");
431 Iterator<String> iterator = list.iterator();
432 assertEquals("cool",
433 Iterators.tryFind(iterator, Predicates.equalTo("cool")).get());
434 }
435
436 public void testTryFind_lastElement() {
437 Iterable<String> list = Lists.newArrayList("cool", "pants");
438 Iterator<String> iterator = list.iterator();
439 assertEquals("pants",
440 Iterators.tryFind(iterator, Predicates.equalTo("pants")).get());
441 }
442
443 public void testTryFind_alwaysTrue() {
444 Iterable<String> list = Lists.newArrayList("cool", "pants");
445 Iterator<String> iterator = list.iterator();
446 assertEquals("cool",
447 Iterators.tryFind(iterator, Predicates.alwaysTrue()).get());
448 }
449
450 public void testTryFind_alwaysFalse_orDefault() {
451 Iterable<String> list = Lists.newArrayList("cool", "pants");
452 Iterator<String> iterator = list.iterator();
453 assertEquals("woot",
454 Iterators.tryFind(iterator, Predicates.alwaysFalse()).or("woot"));
455 assertFalse(iterator.hasNext());
456 }
457
458 public void testTryFind_alwaysFalse_isPresent() {
459 Iterable<String> list = Lists.newArrayList("cool", "pants");
460 Iterator<String> iterator = list.iterator();
461 assertFalse(
462 Iterators.tryFind(iterator, Predicates.alwaysFalse()).isPresent());
463 assertFalse(iterator.hasNext());
464 }
465
466 public void testTransform() {
467 Iterator<String> input = asList("1", "2", "3").iterator();
468 Iterator<Integer> result = Iterators.transform(input,
469 new Function<String, Integer>() {
470 @Override
471 public Integer apply(String from) {
472 return Integer.valueOf(from);
473 }
474 });
475
476 List<Integer> actual = Lists.newArrayList(result);
477 List<Integer> expected = asList(1, 2, 3);
478 assertEquals(expected, actual);
479 }
480
481 public void testTransformRemove() {
482 List<String> list = Lists.newArrayList("1", "2", "3");
483 Iterator<String> input = list.iterator();
484 Iterator<Integer> iterator = Iterators.transform(input,
485 new Function<String, Integer>() {
486 @Override
487 public Integer apply(String from) {
488 return Integer.valueOf(from);
489 }
490 });
491
492 assertEquals(Integer.valueOf(1), iterator.next());
493 assertEquals(Integer.valueOf(2), iterator.next());
494 iterator.remove();
495 assertEquals(asList("1", "3"), list);
496 }
497
498 public void testPoorlyBehavedTransform() {
499 Iterator<String> input = asList("1", null, "3").iterator();
500 Iterator<Integer> result = Iterators.transform(input,
501 new Function<String, Integer>() {
502 @Override
503 public Integer apply(String from) {
504 return Integer.valueOf(from);
505 }
506 });
507
508 result.next();
509 try {
510 result.next();
511 fail("Expected NFE");
512 } catch (NumberFormatException nfe) {
513
514 }
515 }
516
517 public void testNullFriendlyTransform() {
518 Iterator<Integer> input = asList(1, 2, null, 3).iterator();
519 Iterator<String> result = Iterators.transform(input,
520 new Function<Integer, String>() {
521 @Override
522 public String apply(Integer from) {
523 return String.valueOf(from);
524 }
525 });
526
527 List<String> actual = Lists.newArrayList(result);
528 List<String> expected = asList("1", "2", "null", "3");
529 assertEquals(expected, actual);
530 }
531
532 public void testCycleOfEmpty() {
533
534 Iterator<String> cycle = Iterators.<String>cycle();
535 assertFalse(cycle.hasNext());
536 }
537
538 public void testCycleOfOne() {
539 Iterator<String> cycle = Iterators.cycle("a");
540 for (int i = 0; i < 3; i++) {
541 assertTrue(cycle.hasNext());
542 assertEquals("a", cycle.next());
543 }
544 }
545
546 public void testCycleOfOneWithRemove() {
547 Iterable<String> iterable = Lists.newArrayList("a");
548 Iterator<String> cycle = Iterators.cycle(iterable);
549 assertTrue(cycle.hasNext());
550 assertEquals("a", cycle.next());
551 cycle.remove();
552 assertEquals(Collections.emptyList(), iterable);
553 assertFalse(cycle.hasNext());
554 }
555
556 public void testCycleOfTwo() {
557 Iterator<String> cycle = Iterators.cycle("a", "b");
558 for (int i = 0; i < 3; i++) {
559 assertTrue(cycle.hasNext());
560 assertEquals("a", cycle.next());
561 assertTrue(cycle.hasNext());
562 assertEquals("b", cycle.next());
563 }
564 }
565
566 public void testCycleOfTwoWithRemove() {
567 Iterable<String> iterable = Lists.newArrayList("a", "b");
568 Iterator<String> cycle = Iterators.cycle(iterable);
569 assertTrue(cycle.hasNext());
570 assertEquals("a", cycle.next());
571 assertTrue(cycle.hasNext());
572 assertEquals("b", cycle.next());
573 assertTrue(cycle.hasNext());
574 assertEquals("a", cycle.next());
575 cycle.remove();
576 assertEquals(Collections.singletonList("b"), iterable);
577 assertTrue(cycle.hasNext());
578 assertEquals("b", cycle.next());
579 assertTrue(cycle.hasNext());
580 assertEquals("b", cycle.next());
581 cycle.remove();
582 assertEquals(Collections.emptyList(), iterable);
583 assertFalse(cycle.hasNext());
584 }
585
586 public void testCycleRemoveWithoutNext() {
587 Iterator<String> cycle = Iterators.cycle("a", "b");
588 assertTrue(cycle.hasNext());
589 try {
590 cycle.remove();
591 fail("no exception thrown");
592 } catch (IllegalStateException expected) {
593 }
594 }
595
596 public void testCycleRemoveSameElementTwice() {
597 Iterator<String> cycle = Iterators.cycle("a", "b");
598 cycle.next();
599 cycle.remove();
600 try {
601 cycle.remove();
602 fail("no exception thrown");
603 } catch (IllegalStateException expected) {
604 }
605 }
606
607 public void testCycleWhenRemoveIsNotSupported() {
608 Iterable<String> iterable = asList("a", "b");
609 Iterator<String> cycle = Iterators.cycle(iterable);
610 cycle.next();
611 try {
612 cycle.remove();
613 fail("no exception thrown");
614 } catch (UnsupportedOperationException expected) {
615 }
616 }
617
618 public void testCycleRemoveAfterHasNext() {
619 Iterable<String> iterable = Lists.newArrayList("a");
620 Iterator<String> cycle = Iterators.cycle(iterable);
621 assertTrue(cycle.hasNext());
622 assertEquals("a", cycle.next());
623 assertTrue(cycle.hasNext());
624 cycle.remove();
625 assertEquals(Collections.emptyList(), iterable);
626 assertFalse(cycle.hasNext());
627 }
628
629 public void testCycleNoSuchElementException() {
630 Iterable<String> iterable = Lists.newArrayList("a");
631 Iterator<String> cycle = Iterators.cycle(iterable);
632 assertTrue(cycle.hasNext());
633 assertEquals("a", cycle.next());
634 cycle.remove();
635 assertFalse(cycle.hasNext());
636 try {
637 cycle.next();
638 fail();
639 } catch (NoSuchElementException expected) {}
640 }
641
642 @GwtIncompatible("unreasonably slow")
643 public void testCycleUsingIteratorTester() {
644 new IteratorTester<Integer>(5, UNMODIFIABLE, asList(1, 2, 1, 2, 1,
645 2, 1, 2, 1, 2, 1, 2), IteratorTester.KnownOrder.KNOWN_ORDER) {
646 @Override protected Iterator<Integer> newTargetIterator() {
647 return Iterators.cycle(asList(1, 2));
648 }
649 }.test();
650 }
651
652 @GwtIncompatible("slow (~5s)")
653 public void testConcatNoIteratorsYieldsEmpty() {
654 new EmptyIteratorTester() {
655 @SuppressWarnings("unchecked")
656 @Override protected Iterator<Integer> newTargetIterator() {
657 return Iterators.concat();
658 }
659 }.test();
660 }
661
662 @GwtIncompatible("slow (~5s)")
663 public void testConcatOneEmptyIteratorYieldsEmpty() {
664 new EmptyIteratorTester() {
665 @SuppressWarnings("unchecked")
666 @Override protected Iterator<Integer> newTargetIterator() {
667 return Iterators.concat(iterateOver());
668 }
669 }.test();
670 }
671
672 @GwtIncompatible("slow (~5s)")
673 public void testConcatMultipleEmptyIteratorsYieldsEmpty() {
674 new EmptyIteratorTester() {
675 @Override protected Iterator<Integer> newTargetIterator() {
676 return Iterators.concat(iterateOver(), iterateOver());
677 }
678 }.test();
679 }
680
681 @GwtIncompatible("slow (~3s)")
682 public void testConcatSingletonYieldsSingleton() {
683 new SingletonIteratorTester() {
684 @SuppressWarnings("unchecked")
685 @Override protected Iterator<Integer> newTargetIterator() {
686 return Iterators.concat(iterateOver(1));
687 }
688 }.test();
689 }
690
691 @GwtIncompatible("slow (~5s)")
692 public void testConcatEmptyAndSingletonAndEmptyYieldsSingleton() {
693 new SingletonIteratorTester() {
694 @Override protected Iterator<Integer> newTargetIterator() {
695 return Iterators.concat(iterateOver(), iterateOver(1), iterateOver());
696 }
697 }.test();
698 }
699
700 @GwtIncompatible("fairly slow (~40s)")
701 public void testConcatSingletonAndSingletonYieldsDoubleton() {
702 new DoubletonIteratorTester() {
703 @Override protected Iterator<Integer> newTargetIterator() {
704 return Iterators.concat(iterateOver(1), iterateOver(2));
705 }
706 }.test();
707 }
708
709 @GwtIncompatible("fairly slow (~40s)")
710 public void testConcatSingletonAndSingletonWithEmptiesYieldsDoubleton() {
711 new DoubletonIteratorTester() {
712 @Override protected Iterator<Integer> newTargetIterator() {
713 return Iterators.concat(
714 iterateOver(1), iterateOver(), iterateOver(), iterateOver(2));
715 }
716 }.test();
717 }
718
719 @GwtIncompatible("fairly slow (~50s)")
720 public void testConcatUnmodifiable() {
721 new IteratorTester<Integer>(5, UNMODIFIABLE, asList(1, 2),
722 IteratorTester.KnownOrder.KNOWN_ORDER) {
723 @Override protected Iterator<Integer> newTargetIterator() {
724 return Iterators.concat(asList(1).iterator(),
725 Arrays.<Integer>asList().iterator(), asList(2).iterator());
726 }
727 }.test();
728 }
729
730
731
732
733 public void testConcatContainingNull() {
734 @SuppressWarnings("unchecked")
735 Iterator<Iterator<Integer>> input
736 = asList(iterateOver(1, 2), null, iterateOver(3)).iterator();
737 Iterator<Integer> result = Iterators.concat(input);
738 assertEquals(1, (int) result.next());
739 assertEquals(2, (int) result.next());
740 try {
741 result.hasNext();
742 fail("no exception thrown");
743 } catch (NullPointerException e) {
744 }
745 try {
746 result.next();
747 fail("no exception thrown");
748 } catch (NullPointerException e) {
749 }
750
751 }
752
753 @SuppressWarnings("unchecked")
754 public void testConcatVarArgsContainingNull() {
755 try {
756 Iterators.concat(iterateOver(1, 2), null, iterateOver(3), iterateOver(4),
757 iterateOver(5));
758 fail("no exception thrown");
759 } catch (NullPointerException e) {
760 }
761 }
762
763 public void testAddAllWithEmptyIterator() {
764 List<String> alreadyThere = Lists.newArrayList("already", "there");
765
766 boolean changed = Iterators.addAll(alreadyThere,
767 Iterators.<String>emptyIterator());
768 assertThat(alreadyThere).has().exactly("already", "there").inOrder();
769 assertFalse(changed);
770 }
771
772 public void testAddAllToList() {
773 List<String> alreadyThere = Lists.newArrayList("already", "there");
774 List<String> freshlyAdded = Lists.newArrayList("freshly", "added");
775
776 boolean changed = Iterators.addAll(alreadyThere, freshlyAdded.iterator());
777
778 assertThat(alreadyThere).has().exactly("already", "there", "freshly", "added");
779 assertTrue(changed);
780 }
781
782 public void testAddAllToSet() {
783 Set<String> alreadyThere
784 = Sets.newLinkedHashSet(asList("already", "there"));
785 List<String> oneMore = Lists.newArrayList("there");
786
787 boolean changed = Iterators.addAll(alreadyThere, oneMore.iterator());
788 assertThat(alreadyThere).has().exactly("already", "there").inOrder();
789 assertFalse(changed);
790 }
791
792 @GwtIncompatible("NullPointerTester")
793 public void testNullPointerExceptions() {
794 NullPointerTester tester = new NullPointerTester();
795 tester.testAllPublicStaticMethods(Iterators.class);
796 }
797
798 @GwtIncompatible("Only used by @GwtIncompatible code")
799 private static abstract class EmptyIteratorTester
800 extends IteratorTester<Integer> {
801 protected EmptyIteratorTester() {
802 super(3, MODIFIABLE, Collections.<Integer>emptySet(),
803 IteratorTester.KnownOrder.KNOWN_ORDER);
804 }
805 }
806
807 @GwtIncompatible("Only used by @GwtIncompatible code")
808 private static abstract class SingletonIteratorTester
809 extends IteratorTester<Integer> {
810 protected SingletonIteratorTester() {
811 super(3, MODIFIABLE, singleton(1), IteratorTester.KnownOrder.KNOWN_ORDER);
812 }
813 }
814
815 @GwtIncompatible("Only used by @GwtIncompatible code")
816 private static abstract class DoubletonIteratorTester
817 extends IteratorTester<Integer> {
818 protected DoubletonIteratorTester() {
819 super(5, MODIFIABLE, newArrayList(1, 2),
820 IteratorTester.KnownOrder.KNOWN_ORDER);
821 }
822 }
823
824 private static Iterator<Integer> iterateOver(final Integer... values) {
825 return newArrayList(values).iterator();
826 }
827
828 public void testElementsEqual() {
829 Iterable<?> a;
830 Iterable<?> b;
831
832
833 a = Lists.newArrayList();
834 b = Collections.emptySet();
835 assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
836
837
838 a = asList(4, 8, 15, 16, 23, 42);
839 b = asList(4, 8, 15, 16, 23, 42);
840 assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
841
842
843 a = asList(4, 8, null, 16, 23, 42);
844 b = asList(4, 8, null, 16, 23, 42);
845 assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
846
847
848 a = ImmutableList.of(4, 8, 15, 16, 23, 42);
849 b = asList(4, 8, 15, 16, 23, 42);
850 assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
851
852
853 a = asList(4, 8, 15, 12, 23, 42);
854 b = asList(4, 8, 15, 16, 23, 42);
855 assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
856
857
858 a = asList(4, 8, 15, null, 23, 42);
859 b = asList(4, 8, 15, 16, 23, 42);
860 assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
861 assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
862
863
864 a = asList(4, 8, 15, 16, 23);
865 b = asList(4, 8, 15, 16, 23, 42);
866 assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
867 assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
868
869
870 a = Collections.emptySet();
871 b = asList(4, 8, 15, 16, 23, 42);
872 assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
873 assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
874 }
875
876 public void testPartition_badSize() {
877 Iterator<Integer> source = Iterators.singletonIterator(1);
878 try {
879 Iterators.partition(source, 0);
880 fail();
881 } catch (IllegalArgumentException expected) {
882 }
883 }
884
885 public void testPartition_empty() {
886 Iterator<Integer> source = Iterators.emptyIterator();
887 Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
888 assertFalse(partitions.hasNext());
889 }
890
891 public void testPartition_singleton1() {
892 Iterator<Integer> source = Iterators.singletonIterator(1);
893 Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
894 assertTrue(partitions.hasNext());
895 assertTrue(partitions.hasNext());
896 assertEquals(ImmutableList.of(1), partitions.next());
897 assertFalse(partitions.hasNext());
898 }
899
900 public void testPartition_singleton2() {
901 Iterator<Integer> source = Iterators.singletonIterator(1);
902 Iterator<List<Integer>> partitions = Iterators.partition(source, 2);
903 assertTrue(partitions.hasNext());
904 assertTrue(partitions.hasNext());
905 assertEquals(ImmutableList.of(1), partitions.next());
906 assertFalse(partitions.hasNext());
907 }
908
909 @GwtIncompatible("fairly slow (~50s)")
910 public void testPartition_general() {
911 new IteratorTester<List<Integer>>(5,
912 IteratorFeature.UNMODIFIABLE,
913 ImmutableList.of(
914 asList(1, 2, 3),
915 asList(4, 5, 6),
916 asList(7)),
917 IteratorTester.KnownOrder.KNOWN_ORDER) {
918 @Override protected Iterator<List<Integer>> newTargetIterator() {
919 Iterator<Integer> source = Iterators.forArray(1, 2, 3, 4, 5, 6, 7);
920 return Iterators.partition(source, 3);
921 }
922 }.test();
923 }
924
925 public void testPartition_view() {
926 List<Integer> list = asList(1, 2);
927 Iterator<List<Integer>> partitions
928 = Iterators.partition(list.iterator(), 1);
929
930
931 list.set(0, 3);
932 List<Integer> first = partitions.next();
933
934
935 list.set(0, 4);
936
937 assertEquals(ImmutableList.of(3), first);
938 }
939
940 @GwtIncompatible("?")
941
942 public void testPartitionRandomAccess() {
943 Iterator<Integer> source = asList(1, 2, 3).iterator();
944 Iterator<List<Integer>> partitions = Iterators.partition(source, 2);
945 assertTrue(partitions.next() instanceof RandomAccess);
946 assertTrue(partitions.next() instanceof RandomAccess);
947 }
948
949 public void testPaddedPartition_badSize() {
950 Iterator<Integer> source = Iterators.singletonIterator(1);
951 try {
952 Iterators.paddedPartition(source, 0);
953 fail();
954 } catch (IllegalArgumentException expected) {
955 }
956 }
957
958 public void testPaddedPartition_empty() {
959 Iterator<Integer> source = Iterators.emptyIterator();
960 Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
961 assertFalse(partitions.hasNext());
962 }
963
964 public void testPaddedPartition_singleton1() {
965 Iterator<Integer> source = Iterators.singletonIterator(1);
966 Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
967 assertTrue(partitions.hasNext());
968 assertTrue(partitions.hasNext());
969 assertEquals(ImmutableList.of(1), partitions.next());
970 assertFalse(partitions.hasNext());
971 }
972
973 public void testPaddedPartition_singleton2() {
974 Iterator<Integer> source = Iterators.singletonIterator(1);
975 Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
976 assertTrue(partitions.hasNext());
977 assertTrue(partitions.hasNext());
978 assertEquals(asList(1, null), partitions.next());
979 assertFalse(partitions.hasNext());
980 }
981
982 @GwtIncompatible("fairly slow (~50s)")
983 public void testPaddedPartition_general() {
984 new IteratorTester<List<Integer>>(5,
985 IteratorFeature.UNMODIFIABLE,
986 ImmutableList.of(
987 asList(1, 2, 3),
988 asList(4, 5, 6),
989 asList(7, null, null)),
990 IteratorTester.KnownOrder.KNOWN_ORDER) {
991 @Override protected Iterator<List<Integer>> newTargetIterator() {
992 Iterator<Integer> source = Iterators.forArray(1, 2, 3, 4, 5, 6, 7);
993 return Iterators.paddedPartition(source, 3);
994 }
995 }.test();
996 }
997
998 public void testPaddedPartition_view() {
999 List<Integer> list = asList(1, 2);
1000 Iterator<List<Integer>> partitions
1001 = Iterators.paddedPartition(list.iterator(), 1);
1002
1003
1004 list.set(0, 3);
1005 List<Integer> first = partitions.next();
1006
1007
1008 list.set(0, 4);
1009
1010 assertEquals(ImmutableList.of(3), first);
1011 }
1012
1013 public void testPaddedPartitionRandomAccess() {
1014 Iterator<Integer> source = asList(1, 2, 3).iterator();
1015 Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
1016 assertTrue(partitions.next() instanceof RandomAccess);
1017 assertTrue(partitions.next() instanceof RandomAccess);
1018 }
1019
1020 public void testForArrayEmpty() {
1021 String[] array = new String[0];
1022 Iterator<String> iterator = Iterators.forArray(array);
1023 assertFalse(iterator.hasNext());
1024 try {
1025 iterator.next();
1026 fail();
1027 } catch (NoSuchElementException expected) {}
1028 }
1029
1030 public void testForArrayTypical() {
1031 String[] array = {"foo", "bar"};
1032 Iterator<String> iterator = Iterators.forArray(array);
1033 assertTrue(iterator.hasNext());
1034 assertEquals("foo", iterator.next());
1035 assertTrue(iterator.hasNext());
1036 try {
1037 iterator.remove();
1038 fail();
1039 } catch (UnsupportedOperationException expected) {}
1040 assertEquals("bar", iterator.next());
1041 assertFalse(iterator.hasNext());
1042 try {
1043 iterator.next();
1044 fail();
1045 } catch (NoSuchElementException expected) {}
1046 }
1047
1048 public void testForArrayOffset() {
1049 String[] array = {"foo", "bar", "cat", "dog"};
1050 Iterator<String> iterator = Iterators.forArray(array, 1, 2, 0);
1051 assertTrue(iterator.hasNext());
1052 assertEquals("bar", iterator.next());
1053 assertTrue(iterator.hasNext());
1054 assertEquals("cat", iterator.next());
1055 assertFalse(iterator.hasNext());
1056 try {
1057 Iterators.forArray(array, 2, 3, 0);
1058 fail();
1059 } catch (IndexOutOfBoundsException expected) {}
1060 }
1061
1062 public void testForArrayLength0() {
1063 String[] array = {"foo", "bar"};
1064 assertFalse(Iterators.forArray(array, 0, 0, 0).hasNext());
1065 assertFalse(Iterators.forArray(array, 1, 0, 0).hasNext());
1066 assertFalse(Iterators.forArray(array, 2, 0, 0).hasNext());
1067 try {
1068 Iterators.forArray(array, -1, 0, 0);
1069 fail();
1070 } catch (IndexOutOfBoundsException expected) {}
1071 try {
1072 Iterators.forArray(array, 3, 0, 0);
1073 fail();
1074 } catch (IndexOutOfBoundsException expected) {}
1075 }
1076
1077 @GwtIncompatible("unreasonably slow")
1078 public void testForArrayUsingTester() {
1079 new IteratorTester<Integer>(6, UNMODIFIABLE, asList(1, 2, 3),
1080 IteratorTester.KnownOrder.KNOWN_ORDER) {
1081 @Override protected Iterator<Integer> newTargetIterator() {
1082 return Iterators.forArray(1, 2, 3);
1083 }
1084 }.test();
1085 }
1086
1087 @GwtIncompatible("unreasonably slow")
1088 public void testForArrayWithOffsetUsingTester() {
1089 new IteratorTester<Integer>(6, UNMODIFIABLE, asList(1, 2, 3),
1090 IteratorTester.KnownOrder.KNOWN_ORDER) {
1091 @Override protected Iterator<Integer> newTargetIterator() {
1092 return Iterators.forArray(new Integer[] { 0, 1, 2, 3, 4 }, 1, 3, 0);
1093 }
1094 }.test();
1095 }
1096
1097 public void testForEnumerationEmpty() {
1098 Enumeration<Integer> enumer = enumerate();
1099 Iterator<Integer> iter = Iterators.forEnumeration(enumer);
1100
1101 assertFalse(iter.hasNext());
1102 try {
1103 iter.next();
1104 fail();
1105 } catch (NoSuchElementException expected) {
1106 }
1107 }
1108
1109 public void testForEnumerationSingleton() {
1110 Enumeration<Integer> enumer = enumerate(1);
1111 Iterator<Integer> iter = Iterators.forEnumeration(enumer);
1112
1113 assertTrue(iter.hasNext());
1114 assertTrue(iter.hasNext());
1115 assertEquals(1, (int) iter.next());
1116 try {
1117 iter.remove();
1118 fail();
1119 } catch (UnsupportedOperationException expected) {
1120 }
1121 assertFalse(iter.hasNext());
1122 try {
1123 iter.next();
1124 fail();
1125 } catch (NoSuchElementException expected) {
1126 }
1127 }
1128
1129 public void testForEnumerationTypical() {
1130 Enumeration<Integer> enumer = enumerate(1, 2, 3);
1131 Iterator<Integer> iter = Iterators.forEnumeration(enumer);
1132
1133 assertTrue(iter.hasNext());
1134 assertEquals(1, (int) iter.next());
1135 assertTrue(iter.hasNext());
1136 assertEquals(2, (int) iter.next());
1137 assertTrue(iter.hasNext());
1138 assertEquals(3, (int) iter.next());
1139 assertFalse(iter.hasNext());
1140 }
1141
1142 public void testAsEnumerationEmpty() {
1143 Iterator<Integer> iter = Iterators.emptyIterator();
1144 Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
1145
1146 assertFalse(enumer.hasMoreElements());
1147 try {
1148 enumer.nextElement();
1149 fail();
1150 } catch (NoSuchElementException expected) {
1151 }
1152 }
1153
1154 public void testAsEnumerationSingleton() {
1155 Iterator<Integer> iter = ImmutableList.of(1).iterator();
1156 Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
1157
1158 assertTrue(enumer.hasMoreElements());
1159 assertTrue(enumer.hasMoreElements());
1160 assertEquals(1, (int) enumer.nextElement());
1161 assertFalse(enumer.hasMoreElements());
1162 try {
1163 enumer.nextElement();
1164 fail();
1165 } catch (NoSuchElementException expected) {
1166 }
1167 }
1168
1169 public void testAsEnumerationTypical() {
1170 Iterator<Integer> iter = ImmutableList.of(1, 2, 3).iterator();
1171 Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
1172
1173 assertTrue(enumer.hasMoreElements());
1174 assertEquals(1, (int) enumer.nextElement());
1175 assertTrue(enumer.hasMoreElements());
1176 assertEquals(2, (int) enumer.nextElement());
1177 assertTrue(enumer.hasMoreElements());
1178 assertEquals(3, (int) enumer.nextElement());
1179 assertFalse(enumer.hasMoreElements());
1180 }
1181
1182 private static Enumeration<Integer> enumerate(Integer... ints) {
1183 Vector<Integer> vector = new Vector<Integer>();
1184 vector.addAll(asList(ints));
1185 return vector.elements();
1186 }
1187
1188 public void testToString() {
1189 Iterator<String> iterator = Lists.newArrayList("yam", "bam", "jam", "ham").iterator();
1190 assertEquals("[yam, bam, jam, ham]", Iterators.toString(iterator));
1191 }
1192
1193 public void testToStringWithNull() {
1194 Iterator<String> iterator = Lists.newArrayList("hello", null, "world").iterator();
1195 assertEquals("[hello, null, world]", Iterators.toString(iterator));
1196 }
1197
1198 public void testToStringEmptyIterator() {
1199 Iterator<String> iterator = Collections.<String>emptyList().iterator();
1200 assertEquals("[]", Iterators.toString(iterator));
1201 }
1202
1203 public void testLimit() {
1204 List<String> list = newArrayList();
1205 try {
1206 Iterators.limit(list.iterator(), -1);
1207 fail("expected exception");
1208 } catch (IllegalArgumentException expected) {
1209
1210 }
1211
1212 assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
1213 assertFalse(Iterators.limit(list.iterator(), 1).hasNext());
1214
1215 list.add("cool");
1216 assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
1217 assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 1)));
1218 assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
1219
1220 list.add("pants");
1221 assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
1222 assertEquals(ImmutableList.of("cool"),
1223 newArrayList(Iterators.limit(list.iterator(), 1)));
1224 assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
1225 assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 3)));
1226 }
1227
1228 public void testLimitRemove() {
1229 List<String> list = newArrayList();
1230 list.add("cool");
1231 list.add("pants");
1232 Iterator<String> iterator = Iterators.limit(list.iterator(), 1);
1233 iterator.next();
1234 iterator.remove();
1235 assertFalse(iterator.hasNext());
1236 assertEquals(1, list.size());
1237 assertEquals("pants", list.get(0));
1238 }
1239
1240 @GwtIncompatible("fairly slow (~30s)")
1241 public void testLimitUsingIteratorTester() {
1242 final List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
1243 new IteratorTester<Integer>(5, MODIFIABLE, newArrayList(1, 2, 3),
1244 IteratorTester.KnownOrder.KNOWN_ORDER) {
1245 @Override protected Iterator<Integer> newTargetIterator() {
1246 return Iterators.limit(Lists.newArrayList(list).iterator(), 3);
1247 }
1248 }.test();
1249 }
1250
1251 public void testGetNext_withDefault_singleton() {
1252 Iterator<String> iterator = Collections.singletonList("foo").iterator();
1253 assertEquals("foo", Iterators.getNext(iterator, "bar"));
1254 }
1255
1256 public void testGetNext_withDefault_empty() {
1257 Iterator<String> iterator = Iterators.emptyIterator();
1258 assertEquals("bar", Iterators.getNext(iterator, "bar"));
1259 }
1260
1261 public void testGetNext_withDefault_empty_null() {
1262 Iterator<String> iterator = Iterators.emptyIterator();
1263 assertNull(Iterators.getNext(iterator, null));
1264 }
1265
1266 public void testGetNext_withDefault_two() {
1267 Iterator<String> iterator = asList("foo", "bar").iterator();
1268 assertEquals("foo", Iterators.getNext(iterator, "x"));
1269 }
1270
1271 public void testGetLast_basic() {
1272 List<String> list = newArrayList();
1273 list.add("a");
1274 list.add("b");
1275 assertEquals("b", getLast(list.iterator()));
1276 }
1277
1278 public void testGetLast_exception() {
1279 List<String> list = newArrayList();
1280 try {
1281 getLast(list.iterator());
1282 fail();
1283 } catch (NoSuchElementException expected) {
1284 }
1285 }
1286
1287 public void testGetLast_withDefault_singleton() {
1288 Iterator<String> iterator = Collections.singletonList("foo").iterator();
1289 assertEquals("foo", Iterators.getLast(iterator, "bar"));
1290 }
1291
1292 public void testGetLast_withDefault_empty() {
1293 Iterator<String> iterator = Iterators.emptyIterator();
1294 assertEquals("bar", Iterators.getLast(iterator, "bar"));
1295 }
1296
1297 public void testGetLast_withDefault_empty_null() {
1298 Iterator<String> iterator = Iterators.emptyIterator();
1299 assertNull(Iterators.getLast(iterator, null));
1300 }
1301
1302 public void testGetLast_withDefault_two() {
1303 Iterator<String> iterator = asList("foo", "bar").iterator();
1304 assertEquals("bar", Iterators.getLast(iterator, "x"));
1305 }
1306
1307 public void testGet_basic() {
1308 List<String> list = newArrayList();
1309 list.add("a");
1310 list.add("b");
1311 Iterator<String> iterator = list.iterator();
1312 assertEquals("b", get(iterator, 1));
1313 assertFalse(iterator.hasNext());
1314 }
1315
1316 public void testGet_atSize() {
1317 List<String> list = newArrayList();
1318 list.add("a");
1319 list.add("b");
1320 Iterator<String> iterator = list.iterator();
1321 try {
1322 get(iterator, 2);
1323 fail();
1324 } catch (IndexOutOfBoundsException expected) {}
1325 assertFalse(iterator.hasNext());
1326 }
1327
1328 public void testGet_pastEnd() {
1329 List<String> list = newArrayList();
1330 list.add("a");
1331 list.add("b");
1332 Iterator<String> iterator = list.iterator();
1333 try {
1334 get(iterator, 5);
1335 fail();
1336 } catch (IndexOutOfBoundsException expected) {}
1337 assertFalse(iterator.hasNext());
1338 }
1339
1340 public void testGet_empty() {
1341 List<String> list = newArrayList();
1342 Iterator<String> iterator = list.iterator();
1343 try {
1344 get(iterator, 0);
1345 fail();
1346 } catch (IndexOutOfBoundsException expected) {}
1347 assertFalse(iterator.hasNext());
1348 }
1349
1350 public void testGet_negativeIndex() {
1351 List<String> list = newArrayList("a", "b", "c");
1352 Iterator<String> iterator = list.iterator();
1353 try {
1354 get(iterator, -1);
1355 fail();
1356 } catch (IndexOutOfBoundsException expected) {}
1357 }
1358
1359 public void testGet_withDefault_basic() {
1360 List<String> list = newArrayList();
1361 list.add("a");
1362 list.add("b");
1363 Iterator<String> iterator = list.iterator();
1364 assertEquals("a", get(iterator, 0, "c"));
1365 assertTrue(iterator.hasNext());
1366 }
1367
1368 public void testGet_withDefault_atSize() {
1369 List<String> list = newArrayList();
1370 list.add("a");
1371 list.add("b");
1372 Iterator<String> iterator = list.iterator();
1373 assertEquals("c", get(iterator, 2, "c"));
1374 assertFalse(iterator.hasNext());
1375 }
1376
1377 public void testGet_withDefault_pastEnd() {
1378 List<String> list = newArrayList();
1379 list.add("a");
1380 list.add("b");
1381 Iterator<String> iterator = list.iterator();
1382 assertEquals("c", get(iterator, 3, "c"));
1383 assertFalse(iterator.hasNext());
1384 }
1385
1386 public void testGet_withDefault_negativeIndex() {
1387 List<String> list = newArrayList();
1388 list.add("a");
1389 list.add("b");
1390 Iterator<String> iterator = list.iterator();
1391 try {
1392 get(iterator, -1, "c");
1393 fail();
1394 } catch (IndexOutOfBoundsException expected) {
1395
1396 }
1397 assertTrue(iterator.hasNext());
1398 }
1399
1400 public void testAdvance_basic() {
1401 List<String> list = newArrayList();
1402 list.add("a");
1403 list.add("b");
1404 Iterator<String> iterator = list.iterator();
1405 advance(iterator, 1);
1406 assertEquals("b", iterator.next());
1407 }
1408
1409 public void testAdvance_pastEnd() {
1410 List<String> list = newArrayList();
1411 list.add("a");
1412 list.add("b");
1413 Iterator<String> iterator = list.iterator();
1414 advance(iterator, 5);
1415 assertFalse(iterator.hasNext());
1416 }
1417
1418 public void testAdvance_illegalArgument() {
1419 List<String> list = newArrayList("a", "b", "c");
1420 Iterator<String> iterator = list.iterator();
1421 try {
1422 advance(iterator, -1);
1423 fail();
1424 } catch (IllegalArgumentException expected) {}
1425 }
1426
1427 public void testFrequency() {
1428 List<String> list = newArrayList("a", null, "b", null, "a", null);
1429 assertEquals(2, Iterators.frequency(list.iterator(), "a"));
1430 assertEquals(1, Iterators.frequency(list.iterator(), "b"));
1431 assertEquals(0, Iterators.frequency(list.iterator(), "c"));
1432 assertEquals(0, Iterators.frequency(list.iterator(), 4.2));
1433 assertEquals(3, Iterators.frequency(list.iterator(), null));
1434 }
1435
1436 @GwtIncompatible("slow (~4s)")
1437 public void testSingletonIterator() {
1438 new IteratorTester<Integer>(
1439 3, UNMODIFIABLE, singleton(1), IteratorTester.KnownOrder.KNOWN_ORDER) {
1440 @Override protected Iterator<Integer> newTargetIterator() {
1441 return Iterators.singletonIterator(1);
1442 }
1443 }.test();
1444 }
1445
1446 public void testRemoveAll() {
1447 List<String> list = newArrayList("a", "b", "c", "d", "e");
1448 assertTrue(Iterators.removeAll(
1449 list.iterator(), newArrayList("b", "d", "f")));
1450 assertEquals(newArrayList("a", "c", "e"), list);
1451 assertFalse(Iterators.removeAll(
1452 list.iterator(), newArrayList("x", "y", "z")));
1453 assertEquals(newArrayList("a", "c", "e"), list);
1454 }
1455
1456 public void testRemoveIf() {
1457 List<String> list = newArrayList("a", "b", "c", "d", "e");
1458 assertTrue(Iterators.removeIf(
1459 list.iterator(),
1460 new Predicate<String>() {
1461 @Override
1462 public boolean apply(String s) {
1463 return s.equals("b") || s.equals("d") || s.equals("f");
1464 }
1465 }));
1466 assertEquals(newArrayList("a", "c", "e"), list);
1467 assertFalse(Iterators.removeIf(
1468 list.iterator(),
1469 new Predicate<String>() {
1470 @Override
1471 public boolean apply(String s) {
1472 return s.equals("x") || s.equals("y") || s.equals("z");
1473 }
1474 }));
1475 assertEquals(newArrayList("a", "c", "e"), list);
1476 }
1477
1478 public void testRetainAll() {
1479 List<String> list = newArrayList("a", "b", "c", "d", "e");
1480 assertTrue(Iterators.retainAll(
1481 list.iterator(), newArrayList("b", "d", "f")));
1482 assertEquals(newArrayList("b", "d"), list);
1483 assertFalse(Iterators.retainAll(
1484 list.iterator(), newArrayList("b", "e", "d")));
1485 assertEquals(newArrayList("b", "d"), list);
1486 }
1487
1488 @GwtIncompatible("ListTestSuiteBuilder")
1489 private static Test testsForRemoveAllAndRetainAll() {
1490 return ListTestSuiteBuilder.using(new TestStringListGenerator() {
1491 @Override public List<String> create(final String[] elements) {
1492 final List<String> delegate = newArrayList(elements);
1493 return new ForwardingList<String>() {
1494 @Override protected List<String> delegate() {
1495 return delegate;
1496 }
1497
1498 @Override public boolean removeAll(Collection<?> c) {
1499 return Iterators.removeAll(iterator(), c);
1500 }
1501
1502 @Override public boolean retainAll(Collection<?> c) {
1503 return Iterators.retainAll(iterator(), c);
1504 }
1505 };
1506 }
1507 })
1508 .named("ArrayList with Iterators.removeAll and retainAll")
1509 .withFeatures(
1510 ListFeature.GENERAL_PURPOSE,
1511 CollectionFeature.ALLOWS_NULL_VALUES,
1512 CollectionSize.ANY)
1513 .createTestSuite();
1514 }
1515
1516 public void testConsumingIterator() {
1517
1518 List<String> list = Lists.newArrayList("a", "b");
1519
1520
1521 Iterator<String> consumingIterator =
1522 Iterators.consumingIterator(list.iterator());
1523
1524 assertEquals("Iterators.consumingIterator(...)", consumingIterator.toString());
1525
1526 assertThat(list).has().exactly("a", "b").inOrder();
1527
1528 assertTrue(consumingIterator.hasNext());
1529 assertThat(list).has().exactly("a", "b").inOrder();
1530 assertEquals("a", consumingIterator.next());
1531 assertThat(list).has().item("b");
1532
1533 assertTrue(consumingIterator.hasNext());
1534 assertEquals("b", consumingIterator.next());
1535 assertThat(list).isEmpty();
1536
1537 assertFalse(consumingIterator.hasNext());
1538 }
1539
1540 @GwtIncompatible("?")
1541
1542 public void testConsumingIterator_duelingIterators() {
1543
1544 List<String> list = Lists.newArrayList("a", "b");
1545
1546
1547 Iterator<String> i1 = Iterators.consumingIterator(list.iterator());
1548 Iterator<String> i2 = Iterators.consumingIterator(list.iterator());
1549
1550 i1.next();
1551 try {
1552 i2.next();
1553 fail("Concurrent modification should throw an exception.");
1554 } catch (ConcurrentModificationException cme) {
1555
1556 }
1557 }
1558
1559 public void testIndexOf_consumedData() {
1560 Iterator<String> iterator =
1561 Lists.newArrayList("manny", "mo", "jack").iterator();
1562 assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
1563 assertEquals("jack", iterator.next());
1564 assertFalse(iterator.hasNext());
1565 }
1566
1567 public void testIndexOf_consumedDataWithDuplicates() {
1568 Iterator<String> iterator =
1569 Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
1570 assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
1571 assertEquals("mo", iterator.next());
1572 assertEquals("jack", iterator.next());
1573 assertFalse(iterator.hasNext());
1574 }
1575
1576 public void testIndexOf_consumedDataNoMatch() {
1577 Iterator<String> iterator =
1578 Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
1579 assertEquals(-1, Iterators.indexOf(iterator, Predicates.equalTo("bob")));
1580 assertFalse(iterator.hasNext());
1581 }
1582
1583 @SuppressWarnings("deprecation")
1584 public void testUnmodifiableIteratorShortCircuit() {
1585 Iterator<String> mod = Lists.newArrayList("a", "b", "c").iterator();
1586 UnmodifiableIterator<String> unmod = Iterators.unmodifiableIterator(mod);
1587 assertNotSame(mod, unmod);
1588 assertSame(unmod, Iterators.unmodifiableIterator(unmod));
1589 assertSame(unmod, Iterators.unmodifiableIterator((Iterator<String>) unmod));
1590 }
1591
1592 @SuppressWarnings("deprecation")
1593 public void testPeekingIteratorShortCircuit() {
1594 Iterator<String> nonpeek = Lists.newArrayList("a", "b", "c").iterator();
1595 PeekingIterator<String> peek = Iterators.peekingIterator(nonpeek);
1596 assertNotSame(peek, nonpeek);
1597 assertSame(peek, Iterators.peekingIterator(peek));
1598 assertSame(peek, Iterators.peekingIterator((Iterator<String>) peek));
1599 }
1600 }